package com.edee.bigday.auth.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.edee.bigday.auth.feign.MemberFeighService;
import com.edee.common.vo.MemberRespVo;
import com.edee.bigday.auth.vo.SocialUser;
import com.edee.common.utils.HttpUtils;
import com.edee.common.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;

//import javax.servlet.http.HttpSession;

/**
 * 专门用于处理社交登录请求
 */
@Slf4j
@Controller
public class OAuth2Controller {

    @Autowired
    MemberFeighService memberFeighService;

    /**
     * 社交登录成功回调
     *
     * @param code
     * @return
     * @throws Exception
     */
    @RequestMapping("/oauth2.0/weibo/success")
    public String weibo(@RequestParam("code") String code, HttpSession session, HttpServletResponse servletResponse) throws Exception {
        Map<String, String> header = new HashMap<>();
        Map<String, String> query = new HashMap<>();

        Map<String, String> map = new HashMap<>();
//        map.put("client_id", "4172235261");
        map.put("client_id", "1217847356");
//        map.put("client_secret", "25c45b73e2e8ec8f8797345199d99fb1");
//        map.put("client_secret", "923fe157253146cd666b898d406d6e05");
        map.put("client_secret", "505be460b3a8e6f18b41e6c56bb6ef1f");
        map.put("grant_type", "authorization_code");
        map.put("redirect_uri", "http://auth.bigday.com/oauth2.0/weibo/success");
        map.put("code", code);
        //1、使用code换取accessToken：
        HttpResponse response = HttpUtils.doPost("https://api.weibo.com", "/oauth2/access_token", "post", header, query, map);

        //2、换取accessToken后的详细处理：
        if (response.getStatusLine().getStatusCode() == 200) {
            //获取到了accessToken
            //将response中的实体转换为JSON字符串：
            String json = EntityUtils.toString(response.getEntity());
            //再将JSON字符串转换为指定类型的对象：
            SocialUser socialUser = JSON.parseObject(json, SocialUser.class);
            //上述JSON数据成功封装为SocialUser，可以知道进行社交登录的用户信息：
            //1）如果当前用户是第一次访问网站，则自动注册到系统中（为当前社交用户生成一个会员信息账号，是社交用户对应指定的会员账号）
            //登录或注册社交用户：
            R socialLogin = memberFeighService.socialLogin(socialUser);
            if (socialLogin.getCode() == 0) {
                MemberRespVo data = socialLogin.getData("data", new TypeReference<>() {
                });
                //System.out.println("登录成功，用户信息为："+data);
                log.info("登录成功，用户信息为：{}", data.toString()); //需添加@Slf4j
                //第一次用session，命令浏览器保存名称为JSESSIONID的cookie。之后浏览器访问哪个网站，
                // 就会携带该网站对应的cookie。
                //父域：bigday.com，子域：auth.bigday.com、search.bigday.com、order.bigday.com
                //功能需求：访问子域时产生的cookie，如何使父域也能直接使用？
                //浏览器可以协助实现上述需求：只要是当前所访问域名下的cookie，再次访问时都会携带。
                //首先，要进行域名范围扩大。在保存cookie的时候要指定为父域名（此时如果手动指定，相对复杂，可以使用SpringSession来解决）：
                //servletResponse.addCookie(new Cookie("JSESSIONID","data").setDomain(".bigday.com"));
                //TODO 1、默认令牌形式：session=xxx，作用域为当前域名，需要解决子域的session共享问题。
                //TODO 2、使用JSON的序列化方式来简化对象在存储到redis的序列化。
                session.setAttribute("loginUser", data);
                //3、登录成功，跳转至首页：
                return "redirect:http://bigday.com";
            } else {
                //4、登录失败，重定向至登录页：
                return "redirect:http://auth.bigday.com/login.html";
            }
        } else {
            //未获取到accessToken，重定向至登录页：
            return "redirect:http://auth.bigday.com/login.html";
        }

    }
}
